/*
 * @Author: 15766128266 1692088537@qq.com
 * @Date: 2024-03-30 20:04:38
 * @LastEditors: 15766128266 1692088537@qq.com
 * @LastEditTime: 2024-03-31 12:30:47
 * @FilePath: /240125dcode/Task.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once//hpp头文件允许把方法的声明和实现写在一起，如果想要别人直接用源代码而不需要特殊保护源代码，就可以采用hpp文件（比如一些开源的）
//之所以把头文件（.h）和源文件（.c 、 .cpp等）分开是因为C/C++可能要把自身的源代码打包成库
//但是必须给别人提供头文件，这样对方在include时才能链接到这个库，把源代码变成库，本身就是对源代码的保护

#include <iostream>
#include <functional>//
#include <vector>
#include <ctime>
#include <unistd.h>

// using task_t = std::function<void()>;//C++11的语法，和下面的代码意思一样
typedef std::function<void()> task_t;

void Download()
{
    std::cout << "我是一个下载任务"
              << " 处理者: " << getpid() << std::endl;
}

void PrintLog()
{
    std::cout << "我是一个打印日志的任务"
              << " 处理者: " << getpid() << std::endl;
}

void PushVideoStream()
{
    std::cout << "这是一个推送视频流的任务"
              << " 处理者: " << getpid() << std::endl;
}

// void ProcessExit()
// {
//     exit(0);
// }

class Init
{
public:
    // 任务码
    const static int g_download_code = 0;
    const static int g_printlog_code = 1;
    const static int g_push_videostream_code = 2;
    // 任务集合
    std::vector<task_t> tasks;//为什么不能static修饰

public:
    Init()
    {
        tasks.push_back(Download);
        tasks.push_back(PrintLog);
        tasks.push_back(PushVideoStream);

        srand(time(nullptr) ^ getpid());//这啥
    }
    bool CheckSafe(int code)
    {
        if (code >= 0 && code < tasks.size())
            return true;
        else
            return false;
    }
    void RunTask(int code)
    {
        return tasks[code]();
    }
    int SelectTask()
    {
        return rand() % tasks.size();
    }
    std::string ToDesc(int code)//sendcommand函数中获得任务码对应的任务名称
    {
        switch (code)
        {
        case g_download_code:
            return "Download";
        case g_printlog_code:
            return "PrintLog";
        case g_push_videostream_code:
            return "PushVideoStream";
        default:
            return "Unknow";
        }
    }
};

Init init; // 定义对象